import Vue from 'vue'

function deepClone (obj) {
  // 判断类型都否需要深拷贝
  const isObject = args => (typeof args === 'object' || typeof args === 'function') && typeof args !== 'undefined'
  // 不是则报一个错
  if (!isObject) throw new Error('Not Reference Types')
  // 判断是否为数组并赋予Array原型
  const newObj = Array.isArray(obj) ? [...obj] : { ...obj }
  Reflect.ownKeys(newObj).map(key => {
    // 判断子结点是仍为对象, 如果是则递归
    newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
  })
  return newObj
}

Vue.prototype.$deepClone = deepClone

// Vue.prototype.$deepClone = function (obj) {
//   // 判断类型都否需要深拷贝
//   const isObject = args => (typeof args === 'object' || typeof args === 'function') && typeof args !== 'undefined'
//   // 不是则报一个错
//   if (!isObject) throw new Error('Not Reference Types')
//   // 判断是否为数组并赋予Array原型
//   const newObj = Array.isArray(obj) ? [...obj] : { ...obj }
//   Reflect.ownKeys(newObj).map(key => {
//     // 判断子结点是仍为对象, 如果是则递归
//     newObj[key] = isObject(obj[key]) ? this.$deepClone(obj[key]) : obj[key]
//   })
//   return newObj
// }.bind(Vue)
